home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 11
/
Cream of the Crop 11-1.iso
/
games
/
ted5.zip
/
TED5-3.C
< prev
next >
Wrap
C/C++ Source or Header
|
1995-10-20
|
44KB
|
2,034 lines
////////////////////////////////////////////////////
////////////////////////////////////////////////////
//
// TED5-3
//
////////////////////////////////////////////////////
////////////////////////////////////////////////////
#include "ted5.h"
#pragma hdrstop
int xms1;
extern int tics;
////////////////////////////////////////////////////
//
// MAP SCROLLING
//
////////////////////////////////////////////////////
void CheckMapScroll(void)
{
//
// LEFT
//
if (keydown[0x4b]) // left arrow
{
int i,j,imax,jmax,tilesmoved;
tics=biostime(0,0);
if (xbase)
{
EraseFloatPaste();
if (keydown[0x1d]) // CTRL-KEY
{
tilesmoved=screenw;
if (keydown[0x38]) // ALT-KEY
{
xbase=0;
DrawMap();
return;
}
}
else
switch(videomode)
{
case CGA:
case EGA1:
case VGA:
tilesmoved=1;
break;
case EGA2:
tilesmoved=2;
}
if (xbase<tilesmoved)
tilesmoved=xbase;
xbase-=tilesmoved;
MouseHide();
if (tilesmoved<screenw)
CopyScreen(0,8,infomaxw-(tilesmoved<<(tsize-1)),screenh<<(tsize+2),tilesmoved<<(tsize-1),8);
jmax=screenh;
if (jmax>mapheight)
jmax=mapheight;
for (i=0;i<tilesmoved;i++)
for (j=0;j<jmax;j++)
{
unsigned tilet,tilem,tilei,loc;
loc=(ybase+j)*mapwidth+xbase+i;
tilet=*(MapBkgnd+loc);
tilem=*(MapFrgnd+loc)+tilenum;
tilei=*(MapInfoPl+loc)+tilenum;
CombineTiles(tilet*viewton-BkgndColor*(!viewton),tilem*viewmon,tilei*viewion,tsize);
if (GridMode)
Overlay(tsize);
DrawTile(i<<(tsize-1),j*(4<<tsize)+8,tsize);
CheckInfoValues(i,j,tilei);
CheckSelectEdges(i+xbase,j+ybase,i,j);
}
px+=tilesmoved;
DrawFloatPaste();
MouseShow();
if (keydown[0x36] || keydown[0x1d])
while(keydown[0x4b]);
}
}
else
//
// RIGHT
//
if (keydown[0x4d]) // right arrow
{
int i,j,imax,jmax,tilesmoved;
tics=biostime(0,0);
if (xbase+screenw<mapwidth)
{
EraseFloatPaste();
if (keydown[0x1d]) // CTRL-KEY
{
tilesmoved=screenw;
if (keydown[0x38]) // ALT-KEY
{
xbase=mapwidth-screenw;
DrawMap();
return;
}
}
else
switch(videomode)
{
case CGA:
case EGA1:
case VGA:
tilesmoved=1;
break;
case EGA2:
tilesmoved=2;
}
if (xbase+screenw+tilesmoved>=mapwidth)
tilesmoved=mapwidth-screenw-xbase;
xbase+=tilesmoved;
MouseHide();
if (tilesmoved<screenw)
CopyScreen(tilesmoved<<(tsize-1),8,infomaxw-(tilesmoved<<(tsize-1)),screenh<<(tsize+2),0,8);
jmax=screenh;
if (jmax>mapheight)
jmax=mapheight;
for (i=0;i<tilesmoved;i++)
for (j=0;j<jmax;j++)
{
unsigned tilet,tilem,tilei,loc;
loc=(ybase+j)*mapwidth+xbase+screenw-tilesmoved+i;
tilet=*(MapBkgnd+loc);
tilem=*(MapFrgnd+loc)+tilenum;
tilei=*(MapInfoPl+loc)+tilenum;
CombineTiles(tilet*viewton-BkgndColor*(!viewton),tilem*viewmon,tilei*viewion,tsize);
if (GridMode)
Overlay(tsize);
DrawTile(infomaxw-((tilesmoved-i)<<(tsize-1)),j*(4<<tsize)+8,tsize);
CheckInfoValues(screenw-tilesmoved+i,j,tilei);
CheckSelectEdges(screenw-tilesmoved+i+xbase,j+ybase,i+screenw-tilesmoved,j);
}
px+=tilesmoved;
DrawFloatPaste();
MouseShow();
if (keydown[0x36] || keydown[0x1d])
while(keydown[0x4d]);
}
}
//
// UP
//
if (keydown[0x48]) // up arrow
{
int i,j,imax,jmax,tilesmoved;
tics=biostime(0,0);
if (ybase)
{
EraseFloatPaste();
if (keydown[0x1d]) // CTRL-KEY
{
tilesmoved=screenh;
if (keydown[0x38]) // ALT-KEY
{
ybase=0;
DrawMap();
return;
}
}
else
switch(videomode)
{
case CGA:
case EGA1:
case VGA:
tilesmoved=1;
break;
case EGA2:
tilesmoved=2;
}
if (ybase<tilesmoved)
tilesmoved=ybase;
ybase-=tilesmoved;
MouseHide();
if (tilesmoved<screenh)
CopyScreen(0,8,infomaxw,(screenh-tilesmoved)<<(tsize+2),0,8+(tilesmoved<<(tsize+2)));
imax=screenw;
if (imax>mapwidth)
imax=mapwidth;
for (j=0;j<tilesmoved;j++)
for (i=0;i<imax;i++)
{
unsigned tilet,tilem,tilei,loc;
loc=(ybase+j)*mapwidth+xbase+i;
tilet=*(MapBkgnd+loc);
tilem=*(MapFrgnd+loc)+tilenum;
tilei=*(MapInfoPl+loc)+tilenum;
CombineTiles(tilet*viewton-BkgndColor*(!viewton),tilem*viewmon,tilei*viewion,tsize);
if (GridMode)
Overlay(tsize);
DrawTile(i<<(tsize-1),8+(j<<(tsize+2)),tsize);
CheckInfoValues(i,j,tilei);
CheckSelectEdges(i+xbase,j+ybase,i,j);
}
py+=tilesmoved;
DrawFloatPaste();
MouseShow();
if (keydown[0x36] || keydown[0x1d])
while(keydown[0x48]);
}
}
else
//
// DOWN
//
if (keydown[0x50]) // down arrow
{
int i,j,imax,jmax,tilesmoved;
tics=biostime(0,0);
if (ybase+screenh<mapheight)
{
EraseFloatPaste();
if (keydown[0x1d]) // CTRL-KEY
{
tilesmoved=screenh;
if (keydown[0x38]) // ALT-KEY
{
ybase=mapheight-screenh;
DrawMap();
return;
}
}
else
switch(videomode)
{
case CGA:
case EGA1:
case VGA:
tilesmoved=1;
break;
case EGA2:
tilesmoved=2;
}
if (ybase+screenh+tilesmoved>=mapheight)
tilesmoved=mapheight-screenh-ybase;
ybase+=tilesmoved;
MouseHide();
if (tilesmoved<screenh)
CopyScreen(0,8+(tilesmoved<<(tsize+2)),infomaxw,(screenh-tilesmoved)<<(tsize+2),0,8);
imax=screenw;
if (imax>mapwidth)
imax=mapwidth;
for (j=0;j<tilesmoved;j++)
for (i=0;i<imax;i++)
{
unsigned tilet,tilem,tilei,loc;
loc=(ybase+j+screenh-tilesmoved)*mapwidth+xbase+i;
tilet=*(MapBkgnd+loc);
tilem=*(MapFrgnd+loc)+tilenum;
tilei=*(MapInfoPl+loc)+tilenum;
CombineTiles(tilet*viewton-BkgndColor*(!viewton),tilem*viewmon,tilei*viewion,tsize);
if (GridMode)
Overlay(tsize);
DrawTile(i<<(tsize-1),8+((screenh-tilesmoved+j)<<(tsize+2)),tsize);
CheckInfoValues(i,screenh-tilesmoved+j,tilei);
CheckSelectEdges(i+xbase,screenh-tilesmoved+j+ybase,i,j+screenh-tilesmoved);
}
py+=tilesmoved;
DrawFloatPaste();
MouseShow();
if (keydown[0x36] || keydown[0x1d])
while(keydown[0x50]);
}
}
}
////////////////////////////////////////////////////
//
// Copy a screen section to another, mode independent
//
////////////////////////////////////////////////////
void CopyScreen(int srcx,int srcy,int width,int height,int destx,int desty)
{
switch(videomode)
{
case CGA: CopyCGA(srcx,srcy,width,height,destx,desty); break;
case EGA1:
case EGA2:outport(SCindex,0x0f00 | SCmapmask);CopyEGA(srcx,srcy,width,height,destx,desty); break;
case VGA: CopyVGA(srcx,srcy,width,height,destx,desty);
}
}
////////////////////////////////////////////////////
//
// See if either of the Select edges are visible on the map
// Draw them if so
//
////////////////////////////////////////////////////
void CheckSelectEdges(int x,int y,int i,int j)
{
int temp;
if (SelX2<SelX1)
{
temp=SelX1;
SelX1=SelX2;
SelX2=temp;
}
if (SelY2<SelY1)
{
temp=SelY1;
SelY1=SelY2;
SelY2=temp;
}
if (y==SelY2 && x==SelX2)
{
switch(tsize)
{
case 1: drawchar(i,j+1,8);
break;
case 2: drawchar(i*2+1,j*2+2,8);
drawchar(i*2+1,j*2+1,5);
drawchar(i*2,j*2+2,7);
break;
case 3: drawchar(i*4+3,j*4+4,8);
drawchar(i*4+3,j*4+3,5);
drawchar(i*4+3,j*4+2,5);
drawchar(i*4+3,j*4+1,5);
drawchar(i*4+2,j*4+4,7);
drawchar(i*4+1,j*4+4,7);
drawchar(i*4,j*4+4,7);
break;
}
}
if (y==SelY1 && x==SelX1)
{
switch(tsize)
{
case 1: drawchar(i,j+1,1);
break;
case 2: drawchar(i*2,j*2+1,1);
drawchar(i*2+1,j*2+1,2);
drawchar(i*2,j*2+2,4);
break;
case 3: drawchar(i*4,j*4+1,1);
drawchar(i*4+1,j*4+1,2);
drawchar(i*4+2,j*4+1,2);
drawchar(i*4+3,j*4+1,2);
drawchar(i*4,j*4+2,4);
drawchar(i*4,j*4+3,4);
drawchar(i*4,j*4+4,4);
break;
}
}
if (y==SelY2 && x==SelX1)
{
switch(tsize)
{
case 1: drawchar(i,j+1,6);
break;
case 2: drawchar(i*2 ,j*2+2,6);
drawchar(i*2+1,j*2+2,7);
drawchar(i*2 ,j*2+1,4);
break;
case 3: drawchar(i*4,j*4+4,6);
drawchar(i*4+1,j*4+4,7);
drawchar(i*4+2,j*4+4,7);
drawchar(i*4+3,j*4+4,7);
drawchar(i*4,j*4+1,4);
drawchar(i*4,j*4+2,4);
drawchar(i*4,j*4+3,4);
break;
}
}
if (y==SelY1 && x==SelX2)
{
switch(tsize)
{
case 1: drawchar(i,j+1,3);
break;
case 2: drawchar(i*2+1,j*2+1,3);
drawchar(i*2+1,j*2+2,5);
drawchar(i*2 ,j*2+1,2);
break;
case 3: drawchar(i*4+3,j*4+1,3);
drawchar(i*4+3,j*4+4,5);
drawchar(i*4+3,j*4+3,5);
drawchar(i*4+3,j*4+2,5);
drawchar(i*4+2,j*4+4,7);
drawchar(i*4+1,j*4+4,7);
drawchar(i*4,j*4+4,7);
break;
}
}
if (y==SelY1 && x>SelX1 && x<SelX2)
{
switch(tsize)
{
case 3: drawchar(i*4+2,j*4+1,2);
drawchar(i*4+3,j*4+1,2);
drawchar(i*4+1,j*4+1,2);
drawchar(i*4 ,j*4+1,2);
break;
case 2: drawchar(i*2+1,j*2+1,2);
drawchar(i*2 ,j*2+1,2);
break;
case 1: drawchar(i,j+1,2);
break;
}
}
if (y==SelY2 && x>SelX1 && x<SelX2)
{
switch(tsize)
{
case 1: drawchar(i,j+1,7);
break;
case 2: drawchar(i*2,j*2+2,7);
drawchar(i*2+1,j*2+2,7);
break;
case 3: drawchar(i*4 ,j*4+4,7);
drawchar(i*4+1,j*4+4,7);
drawchar(i*4+2,j*4+4,7);
drawchar(i*4+3,j*4+4,7);
break;
}
}
if (x==SelX1 && y>SelY1 && y<SelY2)
{
switch(tsize)
{
case 3: drawchar(i*4,j*4+3,4);
drawchar(i*4,j*4+4,4);
drawchar(i*4,j*4+2,4);
drawchar(i*4,j*4+1,4);
break;
case 2: drawchar(i*2,j*2+2,4);
drawchar(i*2,j*2+1,4);
break;
case 1: drawchar(i,j+1,4);
break;
}
}
if (x==SelX2 && y>SelY1 && y<SelY2)
{
switch(tsize)
{
case 1: drawchar(i,j+1,5);
break;
case 2: drawchar(i*2+1,j*2+1,5);
drawchar(i*2+1,j*2+2,5);
break;
case 3: drawchar(i*4+3,j*4+1,5);
drawchar(i*4+2,j*4+1,5);
drawchar(i*4+1,j*4+1,5);
drawchar(i*4 ,j*4+1,5);
}
}
}
////////////////////////////////////////////////////
//
// FLOATING PASTE REGION!
//
////////////////////////////////////////////////////
void CheckFloatPaste(int mx,int my)
{
int i,j,maxh,maxw;
if (SnapMode && PasteMode && (pixely>=8 || pixely<infoy*8))
{
mx=(mx/snapxsize)*snapxsize+snapx;
my=(my/snapysize)*snapysize+snapy;
if (mx<xbase)
mx+=snapxsize;
if (my<ybase)
my+=snapysize;
if (mx>=xbase+screenw)
mx-=snapxsize;
if (my>=ybase+screenh)
my-=snapysize;
}
if (!PasteMode || (px==mx && py==my) || (pixely<8 || pixely>infoy*8))
return;
if (mx>mapwidth || my>mapheight)
return;
MouseHide();
EraseFloatPaste();
//
// FLOAT IT...
//
px=mx;
py=my;
DrawFloatPaste();
MouseShow();
}
////////////////////////////////////////////////////
//
// DRAW FLOATING PASTE REGION
//
void DrawFloatPaste(void)
{
int i,j,maxw,maxh;
if (px==-1 || py==-1 || !PasteMode)
return;
//
// NOW, DRAW IT IN A NEW LOCATION!
//
MouseHide();
maxh=TileCopy.h;
if (py+maxh>mapheight)
maxh=mapheight-py;
if (py+maxh-ybase>screenh)
maxh=screenh-(py-ybase);
maxw=TileCopy.w;
if (px+maxw>mapwidth)
maxw=mapwidth-px;
if (px+maxw-xbase>screenw)
maxw=screenw-(px-xbase);
switch(TileCopy.MapOrTileSelect)
{
case 0: // MAP PASTE DRAW
for (j=0;j<maxh;j++)
for (i=0;i<maxw;i++)
{
unsigned tilet,tilem,tilei,loc,loc1,oldt,oldm,oldi;
int theT,theM,theI;
loc=(TileCopy.y+j)*mapwidth+TileCopy.x+i;
loc1=(py+j)*mapwidth+px+i;
tilet=*(CutBkgnd+loc);
oldt=MapBkgnd[loc1];
tilem=*(CutFrgnd+loc)+tilenum;
if (tilem==tilenum)
tilem=0;
oldm=MapFrgnd[loc1]+tilenum;
tilei=*(CutInfoPl+loc)+tilenum;
if (tilei==tilenum)
tilei=0;
oldi=MapInfoPl[loc1]+tilenum;
theT=(TileCopy.PlanesCopied&BPLANE)?tilet:-BkgndColor;
if (theT==-BkgndColor && viewton)
theT=oldt;
theM=(TileCopy.PlanesCopied&FPLANE)?tilem:0;
if (!theM && viewmon && !(TileCopy.PlanesCopied&FPLANE && F3_flag))
theM=oldm;
theI=(TileCopy.PlanesCopied&IPLANE)?tilei:0;
if (!theI && viewion && !(TileCopy.PlanesCopied&IPLANE && F3_flag))
theI=oldi;
CombineTiles(theT,theM,theI,tsize);
if (GridMode)
Overlay(tsize);
DrawTile((px+i-xbase)<<(tsize-1),(py+j-ybase)*(4<<tsize)+8,tsize);
}
break;
case 1: // TILE PASTE DRAW
for (j=0;j<maxh;j++)
for (i=0;i<maxw;i++)
{
int val=(j+TileCopy.y)*selectcols+TileCopy.x+i;
unsigned tilem,tilei,loc;
loc=(py+j)*mapwidth+px+i;
tilem=MapFrgnd[loc]+tilenum;
tilei=MapInfoPl[loc]+tilenum;
if (XMSlookup[val]!=-1)
{
CombineTiles(viewton?val:-BkgndColor,
viewmon?tilem:0,
viewion?tilei:0,
tsize);
if (GridMode)
Overlay(tsize);
DrawTile((px+i-xbase)<<(tsize-1),(py+j-ybase)*(4<<tsize)+8,tsize);
}
}
break;
case 2: // MASKED PASTE DRAW
for (j=0;j<maxh;j++)
for (i=0;i<maxw;i++)
{
int val=(j+TileCopy.y)*selectcols+TileCopy.x+i+tilenum+maxiconrows*selectcols;
unsigned tilet,tilei,loc;
loc=(py+j)*mapwidth+px+i;
tilet=MapBkgnd[loc];
tilei=MapInfoPl[loc]+tilenum;
if (XMSlookup[val]!=-1)
{
CombineTiles(viewton?tilet:-BkgndColor,
viewmon?val:0,
viewion?tilei:0,
tsize);
if (GridMode)
Overlay(tsize);
DrawTile((px+i-xbase)<<(tsize-1),(py+j-ybase)*(4<<tsize)+8,tsize);
}
}
}
MouseShow();
}
////////////////////////////////////////////////////
//
// ERASE FLOATING PASTE REGION
//
void EraseFloatPaste(void)
{
int maxh,maxw,i,j;
if (px==-1 || py==-1 || !PasteMode)
return;
//
// ERASE THE FLOATING REGION
// (PRECLIPPING REGION)
//
MouseHide();
maxh=TileCopy.h;
if (py+maxh>mapheight)
maxh=mapheight-py;
if (py+maxh-ybase>screenh)
maxh=screenh-(py-ybase);
maxw=TileCopy.w;
if (px+maxw>mapwidth)
maxw=mapwidth-px;
if (px+maxw-xbase>screenw)
maxw=screenw-(px-xbase);
for (j=0;j<maxh;j++)
for (i=0;i<maxw;i++)
{
unsigned tile_t,tile_m,tile_i,loc;
loc=(py+j)*mapwidth+px+i;
tile_t=*(MapBkgnd+loc);
tile_m=*(MapFrgnd+loc)+tilenum;
tile_i=*(MapInfoPl+loc)+tilenum;
CombineTiles(viewton?tile_t:-BkgndColor,viewmon?tile_m:0,viewion?tile_i:0,tsize);
if (GridMode)
Overlay(tsize);
DrawTile((px+i-xbase)<<(tsize-1),(py+j-ybase)*(4<<tsize)+8,tsize);
}
MouseShow();
}
////////////////////////////////////////////////////
//
// SAVE CUT BUFFERS TO XMS BEFORE MAP LOAD/CREATE
//
////////////////////////////////////////////////////
void SaveCutBuffers(void)
{
long size,off;
int j;
//
// IS SOMETHING IN THE COPY BUFFER?
// IF SO, PRESERVE AS MUCH AS POSSIBLE
//
if (!TileCopy.MapOrTileSelect)
{
size=(2L*TileCopy.w*TileCopy.h)*(((TileCopy.PlanesCopied&BPLANE)>0)+
((TileCopy.PlanesCopied&FPLANE)>0)+((TileCopy.PlanesCopied&IPLANE)>0));
xms1=XMSAllocate(size);
off=0;
if (TileCopy.PlanesCopied&BPLANE)
for (j=0;j<TileCopy.h;j++)
{
XMSmove(0,(long)MK_FP(CutBkgnd,2L*((TileCopy.y+j)*mapwidth)+2L*TileCopy.x),
xms1,off,2L*TileCopy.w);
off+=2L*TileCopy.w;
}
if (TileCopy.PlanesCopied&FPLANE)
for (j=0;j<TileCopy.h;j++)
{
XMSmove(0,(long)MK_FP(CutFrgnd,2L*((TileCopy.y+j)*mapwidth)+2L*TileCopy.x),
xms1,off,2L*TileCopy.w);
off+=2L*TileCopy.w;
}
if (TileCopy.PlanesCopied&IPLANE)
for (j=0;j<TileCopy.h;j++)
{
XMSmove(0,(long)MK_FP(CutInfoPl,2L*((TileCopy.y+j)*mapwidth)+2L*TileCopy.x),
xms1,off,2L*TileCopy.w);
off+=2L*TileCopy.w;
}
}
}
////////////////////////////////////////////////////
//
// RESTORE CUT BUFFERS FROM XMS AFTER MAP LOAD/CREATE
//
////////////////////////////////////////////////////
void RestoreCutBuffers(void)
{
//
// COPY BACK STUFF IN XMS
//
if (!TileCopy.MapOrTileSelect)
{
long ToOff,off;
int newwidth,newheight,j;
newwidth=(TileCopy.w>mapwidth)?mapwidth:TileCopy.w;
newheight=(TileCopy.h>mapheight)?mapheight:TileCopy.h;
ToOff=off=0;
if (TileCopy.PlanesCopied&BPLANE)
for (j=0;j<newheight;j++)
{
XMSmove(xms1,off,0,(long)MK_FP(CutBkgnd,2L*(j*mapwidth)),2L*newwidth);
ToOff+=2L*newwidth;
off+=2L*TileCopy.w;
}
if (TileCopy.PlanesCopied&FPLANE)
for (j=0;j<newheight;j++)
{
XMSmove(xms1,off,0,(long)MK_FP(CutFrgnd,2L*(j*mapwidth)),2L*newwidth);
ToOff+=2L*newwidth;
off+=2L*TileCopy.w;
}
if (TileCopy.PlanesCopied&IPLANE)
for (j=0;j<newheight;j++)
{
XMSmove(xms1,off,0,(long)MK_FP(CutInfoPl,2L*(j*mapwidth)),2L*newwidth);
ToOff+=2L*newwidth;
off+=2L*TileCopy.w;
}
TileCopy.x=TileCopy.y=0;
TileCopy.w=newwidth;
TileCopy.h=newheight;
XMSFreeMem(xms1); // RELEASE THE MEMORY
}
}
////////////////////////////////////////////////////
//
// SEE IF THERE'S AN INFO VALUES AT THE CURRENT POSITION
// THAT NEEDS TO BE PRINTED
//
////////////////////////////////////////////////////
void CheckInfoValues(int i,int j,int tilei)
{
sx=i<<(tsize-1);
sy=(j<<(tsize-1))+1;
if (TsearchMode)
{
unsigned loc,temp,p=0;
loc=(j+ybase)*mapwidth+i+xbase;
if (planeton)
{
if (MapBkgnd[loc]==whicht)
{
temp=whicht;
p=1;
}
}
else
if (planemon)
{
if (MapFrgnd[loc]==whichtm-tilenum)
{
temp=whichtm-tilenum;
p=1;
}
}
else
if (planeion)
if ((unsigned)MapInfoPl[loc]==whichi-tilenum)
{
temp=whichi-tilenum;
p=1;
}
if (p)
switch(tsize)
{
case 1:
print("#");
break;
case 2:
printhexb(temp>>8);
sx-=2;
sy++;
printhexb(temp&0xff);
break;
case 3: printhex(temp);
}
}
else
if (viewion && tilei>lasticon)
{
switch(tsize)
{
case 1:
print("#");
break;
case 2:
printhexb(tilei-tilenum>>8);
sx-=2;
sy++;
printhexb(tilei-tilenum&0xff);
break;
case 3: printhex(tilei-tilenum);
}
}
}
////////////////////////////////////////////////////
//
// Item - Edit Map Edges
//
////////////////////////////////////////////////////
btype MapEdgeB[]={{"\xb",7,3,1},
{"\xc",7,7,1},
{"\xe",4,5,1},
{"\x1f",10,5,1},
{" Exit ",5,16,2}};
DialogDef MapEdgeD={" PICK MAP EDGE\n"
" TO CHANGE",
16,18,5,&MapEdgeB[0],NULL};
void Item_EditMapEdges(void)
{
int which,val,newwidth,newheight,b,f,i,
_seg *tempB,_seg *tempF,_seg *tempI;
unsigned dx,dy,obx,oby,k,j,modified=0;
long size;
b=MapFileHeader->maptype&BPLANE;
f=MapFileHeader->maptype&FPLANE;
i=MapFileHeader->maptype&IPLANE;
DrawDialog(&MapEdgeD,1);
GetDialogXY(&MapEdgeD,&dx,&dy);
do
{
MouseHide();
sx=dx+2;
sy=dy+14;
print("W:");
printint(MapHeader.width);
print(", H:");
printint(MapHeader.height);
print(" ");
MouseShow();
which=CheckButtons(&MapEdgeD);
GetButtonXY(&MapEdgeD,which-1,&obx,&oby);
MouseHide();
if (which>=1 && which<=4)
{
// DRAW INPUT BAR
sx=dx;
sy=dy+9;
print("+ or - value");
DrawBorder(dx,dy+10,15,2,1);
// INPUT VALUE
sx=dx+1;
sy=dy+11;
val=inputint(9);
// ERASE THE ARROW AND INPUT BAR
sx=obx;
sy=oby;
print(MapEdgeB[which-1].text);
bar(dx,dy+9,dx+15,dy+12,' ');
// CHECK FOR ESC
if (val==(int)ESCOUT)
which=6;
}
MouseShow();
switch(which)
{
//
// ADD OR DELETE FROM TOP
//
case 1:
newheight=mapheight+val;
size=2L*newheight*mapwidth;
if (size<=0 || size>0x10000L)
{
RestoreBackground();
ErrDialog("Invalid Map height!"," OK ");
return;
}
// FREE UP SOME MEMORY!
SaveCutBuffers();
RemoveUndoBuffers();
if (b)
{
MMFreePtr((memptr *)&CutBkgnd);
MMAllocate((memptr *)&tempB,size);
}
if (f)
{
MMFreePtr((memptr *)&CutFrgnd);
MMAllocate((memptr *)&tempF,size);
}
if (i)
{
MMFreePtr((memptr *)&CutInfoPl);
MMAllocate((memptr *)&tempI,size);
}
if (val<0)
{
// COPY MAP PLANES INTO TEMP MEMORY (CLIPPED, HERE)
for (j=abs(val);j<mapheight;j++)
for (k=0;k<mapwidth;k++)
{
if (b)
tempB[(j+val)*mapwidth+k]=MapBkgnd[j*mapwidth+k];
if (f)
tempF[(j+val)*mapwidth+k]=MapFrgnd[j*mapwidth+k];
if (i)
tempI[(j+val)*mapwidth+k]=MapInfoPl[j*mapwidth+k];
}
}
else
{
for (j=0;j<mapheight+val;j++)
for (k=0;k<mapwidth;k++)
{
if (j<abs(val))
{
if (b)
tempB[j*mapwidth+k]=whicht;
if (f)
tempF[j*mapwidth+k]=whichtm-tilenum;
if (i)
tempI[j*mapwidth+k]=whichi-tilenum;
}
else
{
if (b)
tempB[j*mapwidth+k]=MapBkgnd[(j-val)*mapwidth+k];
if (f)
tempF[j*mapwidth+k]=MapFrgnd[(j-val)*mapwidth+k];
if (i)
tempI[j*mapwidth+k]=MapInfoPl[(j-val)*mapwidth+k];
}
}
}
// DEALLOCATE & REALLOCATE THE MAP BUFFERS, RESIZED
if (b)
{
MMFreePtr((memptr *)&MapBkgnd);
MMAllocate((memptr *)&MapBkgnd,size);
}
if (f)
{
MMFreePtr((memptr *)&MapFrgnd);
MMAllocate((memptr *)&MapFrgnd,size);
}
if (i)
{
MMFreePtr((memptr *)&MapInfoPl);
MMAllocate((memptr *)&MapInfoPl,size);
}
// COPY THE REGION BACK IN...
for (j=0;j<newheight;j++)
for (k=0;k<mapwidth;k++)
{
if (b)
MapBkgnd[j*mapwidth+k]=tempB[j*mapwidth+k];
if (f)
MapFrgnd[j*mapwidth+k]=tempF[j*mapwidth+k];
if (i)
MapInfoPl[j*mapwidth+k]=tempI[j*mapwidth+k];
}
// TOAST THE 'TEMP' BUFFERS & REALLOCATE THE 'CUT' BUFFERS
if (b)
{
MMFreePtr((memptr *)&tempB);
MMAllocate((memptr *)&CutBkgnd,size);
}
if (f)
{
MMFreePtr((memptr *)&tempF);
MMAllocate((memptr *)&CutFrgnd,size);
}
if (i)
{
MMFreePtr((memptr *)&tempI);
MMAllocate((memptr *)&CutInfoPl,size);
}
mapheight=newheight;
MapHeader.height=newheight;
modified=DirtyFlag=1;
AllocateUndoBuffers();
UndoRegion.x=-1;
SaveUndo(0,0,mapwidth,mapheight);
RestoreCutBuffers();
break;
//
// ADD OR DELETE FROM BOTTOM
//
case 2:
newheight=mapheight+val;
size=2L*newheight*mapwidth;
if (size<=0 || size>0x10000L)
{
RestoreBackground();
ErrDialog("Invalid Map height!"," OK ");
return;
}
// FREE UP SOME MEMORY!
SaveCutBuffers();
RemoveUndoBuffers();
if (b)
{
MMFreePtr((memptr *)&CutBkgnd);
MMAllocate((memptr *)&tempB,size);
}
if (f)
{
MMFreePtr((memptr *)&CutFrgnd);
MMAllocate((memptr *)&tempF,size);
}
if (i)
{
MMFreePtr((memptr *)&CutInfoPl);
MMAllocate((memptr *)&tempI,size);
}
if (val<0)
{
// COPY MAP PLANES INTO TEMP MEMORY (CLIPPED, HERE)
for (j=0;j<mapheight+val;j++)
for (k=0;k<mapwidth;k++)
{
if (b)
tempB[j*mapwidth+k]=MapBkgnd[j*mapwidth+k];
if (f)
tempF[j*mapwidth+k]=MapFrgnd[j*mapwidth+k];
if (i)
tempI[j*mapwidth+k]=MapInfoPl[j*mapwidth+k];
}
}
else
{
for (j=0;j<mapheight+val;j++)
for (k=0;k<mapwidth;k++)
{
if (j>=mapheight)
{
if (b)
tempB[j*mapwidth+k]=whicht;
if (f)
tempF[j*mapwidth+k]=whichtm-tilenum;
if (i)
tempI[j*mapwidth+k]=whichi-tilenum;
}
else
{
if (b)
tempB[j*mapwidth+k]=MapBkgnd[j*mapwidth+k];
if (f)
tempF[j*mapwidth+k]=MapFrgnd[j*mapwidth+k];
if (i)
tempI[j*mapwidth+k]=MapInfoPl[j*mapwidth+k];
}
}
}
// DEALLOCATE & REALLOCATE THE MAP BUFFERS, RESIZED
if (b)
{
MMFreePtr((memptr *)&MapBkgnd);
MMAllocate((memptr *)&MapBkgnd,size);
}
if (f)
{
MMFreePtr((memptr *)&MapFrgnd);
MMAllocate((memptr *)&MapFrgnd,size);
}
if (i)
{
MMFreePtr((memptr *)&MapInfoPl);
MMAllocate((memptr *)&MapInfoPl,size);
}
// COPY THE REGION BACK IN...
for (j=0;j<newheight;j++)
for (k=0;k<mapwidth;k++)
{
if (b)
MapBkgnd[j*mapwidth+k]=tempB[j*mapwidth+k];
if (f)
MapFrgnd[j*mapwidth+k]=tempF[j*mapwidth+k];
if (i)
MapInfoPl[j*mapwidth+k]=tempI[j*mapwidth+k];
}
// TOAST THE 'TEMP' BUFFERS & REALLOCATE THE 'CUT' BUFFERS
if (b)
{
MMFreePtr((memptr *)&tempB);
MMAllocate((memptr *)&CutBkgnd,size);
}
if (f)
{
MMFreePtr((memptr *)&tempF);
MMAllocate((memptr *)&CutFrgnd,size);
}
if (i)
{
MMFreePtr((memptr *)&tempI);
MMAllocate((memptr *)&CutInfoPl,size);
}
mapheight=newheight;
MapHeader.height=newheight;
modified=DirtyFlag=1;
AllocateUndoBuffers();
UndoRegion.x=-1;
SaveUndo(0,0,mapwidth,mapheight);
RestoreCutBuffers();
break;
//
// ADD OR DELETE FROM LEFTEDGE
//
case 3:
newwidth=mapwidth+val;
size=2L*newwidth*mapheight;
if (size<=0 || size>0x10000L)
{
RestoreBackground();
ErrDialog("Invalid Map width!"," OK ");
return;
}
// FREE UP SOME MEMORY!
SaveCutBuffers();
RemoveUndoBuffers();
if (b)
{
MMFreePtr((memptr *)&CutBkgnd);
MMAllocate((memptr *)&tempB,size);
}
if (f)
{
MMFreePtr((memptr *)&CutFrgnd);
MMAllocate((memptr *)&tempF,size);
}
if (i)
{
MMFreePtr((memptr *)&CutInfoPl);
MMAllocate((memptr *)&tempI,size);
}
if (val<0)
{
// COPY MAP PLANES INTO TEMP MEMORY (CLIPPED, HERE)
for (j=0;j<mapheight;j++)
for (k=abs(val);k<mapwidth;k++)
{
if (b)
tempB[j*newwidth+k+val]=MapBkgnd[j*mapwidth+k];
if (f)
tempF[j*newwidth+k+val]=MapFrgnd[j*mapwidth+k];
if (i)
tempI[j*newwidth+k+val]=MapInfoPl[j*mapwidth+k];
}
}
else
{
for (j=0;j<mapheight;j++)
for (k=0;k<mapwidth+val;k++)
{
if (k<abs(val))
{
if (b)
tempB[j*newwidth+k]=whicht;
if (f)
tempF[j*newwidth+k]=whichtm-tilenum;
if (i)
tempI[j*newwidth+k]=whichi-tilenum;
}
else
{
if (b)
tempB[j*newwidth+k]=MapBkgnd[j*mapwidth+k-val];
if (f)
tempF[j*newwidth+k]=MapFrgnd[j*mapwidth+k-val];
if (i)
tempI[j*newwidth+k]=MapInfoPl[j*mapwidth+k-val];
}
}
}
// DEALLOCATE & REALLOCATE THE MAP BUFFERS, RESIZED
if (b)
{
MMFreePtr((memptr *)&MapBkgnd);
MMAllocate((memptr *)&MapBkgnd,size);
}
if (f)
{
MMFreePtr((memptr *)&MapFrgnd);
MMAllocate((memptr *)&MapFrgnd,size);
}
if (i)
{
MMFreePtr((memptr *)&MapInfoPl);
MMAllocate((memptr *)&MapInfoPl,size);
}
// COPY THE REGION BACK IN...
for (j=0;j<mapheight;j++)
for (k=0;k<newwidth;k++)
{
if (b)
MapBkgnd[j*newwidth+k]=tempB[j*newwidth+k];
if (f)
MapFrgnd[j*newwidth+k]=tempF[j*newwidth+k];
if (i)
MapInfoPl[j*newwidth+k]=tempI[j*newwidth+k];
}
// TOAST THE 'TEMP' BUFFERS & REALLOCATE THE 'CUT' BUFFERS
if (b)
{
MMFreePtr((memptr *)&tempB);
MMAllocate((memptr *)&CutBkgnd,size);
}
if (f)
{
MMFreePtr((memptr *)&tempF);
MMAllocate((memptr *)&CutFrgnd,size);
}
if (i)
{
MMFreePtr((memptr *)&tempI);
MMAllocate((memptr *)&CutInfoPl,size);
}
mapwidth=newwidth;
MapHeader.width=newwidth;
modified=DirtyFlag=1;
AllocateUndoBuffers();
UndoRegion.x=-1;
SaveUndo(0,0,mapwidth,mapheight);
RestoreCutBuffers();
break;
//
// ADD OR DELETE FROM RIGHTEDGE
//
case 4:
newwidth=mapwidth+val;
size=2L*newwidth*mapheight;
if (size<=0 || size>0x10000L)
{
RestoreBackground();
ErrDialog("Invalid Map width!"," OK ");
return;
}
// FREE UP SOME MEMORY!
SaveCutBuffers();
RemoveUndoBuffers();
if (b)
{
MMFreePtr((memptr *)&CutBkgnd);
MMAllocate((memptr *)&tempB,size);
}
if (f)
{
MMFreePtr((memptr *)&CutFrgnd);
MMAllocate((memptr *)&tempF,size);
}
if (i)
{
MMFreePtr((memptr *)&CutInfoPl);
MMAllocate((memptr *)&tempI,size);
}
if (val<0)
{
// COPY MAP PLANES INTO TEMP MEMORY (CLIPPED, HERE)
for (j=0;j<mapheight;j++)
for (k=0;k<mapwidth+val;k++)
{
if (b)
tempB[j*newwidth+k]=MapBkgnd[j*mapwidth+k];
if (f)
tempF[j*newwidth+k]=MapFrgnd[j*mapwidth+k];
if (i)
tempI[j*newwidth+k]=MapInfoPl[j*mapwidth+k];
}
}
else
{
for (j=0;j<mapheight;j++)
for (k=0;k<mapwidth+val;k++)
{
if (k>=mapwidth)
{
if (b)
tempB[j*newwidth+k]=whicht;
if (f)
tempF[j*newwidth+k]=whichtm-tilenum;
if (i)
tempI[j*newwidth+k]=whichi-tilenum;
}
else
{
if (b)
tempB[j*newwidth+k]=MapBkgnd[j*mapwidth+k];
if (f)
tempF[j*newwidth+k]=MapFrgnd[j*mapwidth+k];
if (i)
tempI[j*newwidth+k]=MapInfoPl[j*mapwidth+k];
}
}
}
// DEALLOCATE & REALLOCATE THE MAP BUFFERS, RESIZED
if (b)
{
MMFreePtr((memptr *)&MapBkgnd);
MMAllocate((memptr *)&MapBkgnd,size);
}
if (f)
{
MMFreePtr((memptr *)&MapFrgnd);
MMAllocate((memptr *)&MapFrgnd,size);
}
if (i)
{
MMFreePtr((memptr *)&MapInfoPl);
MMAllocate((memptr *)&MapInfoPl,size);
}
// COPY THE REGION BACK IN...
for (j=0;j<mapheight;j++)
for (k=0;k<newwidth;k++)
{
if (b)
MapBkgnd[j*newwidth+k]=tempB[j*newwidth+k];
if (f)
MapFrgnd[j*newwidth+k]=tempF[j*newwidth+k];
if (i)
MapInfoPl[j*newwidth+k]=tempI[j*newwidth+k];
}
// TOAST THE 'TEMP' BUFFERS & REALLOCATE THE 'CUT' BUFFERS
if (b)
{
MMFreePtr((memptr *)&tempB);
MMAllocate((memptr *)&CutBkgnd,size);
}
if (f)
{
MMFreePtr((memptr *)&tempF);
MMAllocate((memptr *)&CutFrgnd,size);
}
if (i)
{
MMFreePtr((memptr *)&tempI);
MMAllocate((memptr *)&CutInfoPl,size);
}
mapwidth=newwidth;
MapHeader.width=newwidth;
modified=DirtyFlag=1;
AllocateUndoBuffers();
UndoRegion.x=-1;
SaveUndo(0,0,mapwidth,mapheight);
RestoreCutBuffers();
break;
}
} while(which && which!=5);
RestoreBackground();
if (modified)
{
xbase=ybase=0;
MouseHide();
InitDesktop(TED5MenuBar,0);
DrawInfoBar();
DrawMap();
MouseShow();
}
}
////////////////////////////////////////////////////
//
// Display amount of memory available
//
////////////////////////////////////////////////////
btype ShowMemb={" OK ",6,11,2};
DialogDef ShowMemd={"Extended Memory \n"
"Available:\n\n"
"Main Memory\n"
"Available:\n\n"
"In Extended Mem\n"
"----------------\n"
"CGA: EGA:\n"
"VGA: Maps:"
,16,13,1,&ShowMemb,PrintMem};
void Item_PrintMem(void)
{
DoDialog(&ShowMemd);
}
void PrintMem(int x,int y)
{
long total;
char memstring[10];
sx=x+10;
sy=y+1;
itoa(XMSTotalFree(),memstring,10);
strcat(memstring,"K");
print(memstring);
sx=x+10;
sy=y+4;
total=(MMTotalFree()*16L)/1024;
ltoa(total,memstring,10);
strcat(memstring,"K");
print(memstring);
sx=x+4;
sy=y+8;
if (!CgaXMS)
print("No");
else
print("Yes");
sx=x+13;
sy=y+8;
if (!EgaXMS)
print("No");
else
print("Yes");
sx=x+4;
sy=y+9;
if (!VgaXMS)
print("No");
else
print("Yes");
sx=x+13;
sy=y+9;
if (!XMSmaps)
print("No");
else
print("Yes");
}
////////////////////////////////////////////////////
//
// CARMACIZE THE MAP FILE!
//
////////////////////////////////////////////////////
void Item_Huffman(void)
{
OutputHeadStr NewFileHeader;
char huffname[14]="GAMEMAPS.",huffheadname[14]="MAPSHEAD.",tempstr[200],
mapidstr[8]=IDSTRING,objname[14],dictname[14],tempname[14];
int dx,dy,i,oxb,oyb,maplengths[100];
MapHeaderStr TempHeader;
memptr block,block1,block2;
long size,fsize,nsize;
Item_SaveMap();
strcat(huffname,ext);
strcat(huffheadname,ext);
strcpy(tempstr,"This will take a while.\n");
strcat(tempstr,huffname);
strcat(tempstr,". [ ]");
ErrDialog(tempstr,"");
dy=sy;
dx=sx-16;
oxb=xbase;
oyb=ybase;
//
// Free up memory
//
if (MapBkgnd)
{
MMFreePtr((memptr *)&MapBkgnd);
MMFreePtr((memptr *)&CutBkgnd);
}
if (MapFrgnd)
{
MMFreePtr((memptr *)&MapFrgnd);
MMFreePtr((memptr *)&CutFrgnd);
}
if (MapInfoPl)
{
MMFreePtr((memptr *)&MapInfoPl);
MMFreePtr((memptr *)&CutInfoPl);
}
//
// Now, time to Carmacize all the maps
//
sx=dx;
sy=dy;
print("Carmacizing");
dx=sx+1;
fsize=0;
SaveFile(huffname,(char huge *)&mapidstr,fsize,strlen(mapidstr));
fsize+=strlen(mapidstr);
memset(&maplengths,0,sizeof(long)*100);
memset(&NewFileHeader,0,sizeof(OutputHeadStr));
MMAllocate(&block1,sizeof(MapHeaderStr));
for (i=0;i<100;i++)
if (MapFileHeader->dataoffsets[i]!=-1)
{
//
// LOAD MAP HEADER
//
sx=dx;
printint(i);
LoadFile(mapname,(char huge *)&TempHeader,MapFileHeader->dataoffsets[i],sizeof(MapHeaderStr));
//
// COMPRESS EACH MAP PLANE
//
#pragma warn -sus
if (MapFileHeader->maptype&BPLANE)
{
size=TempHeader.mapbkgndlen;
MMAllocate(&block,size);
MMAllocate(&block2,size);
LoadFile(mapname,block,TempHeader.mapbkgndpl,size);
*(int _seg *)block2=TempHeader.mapbkgndlen;
nsize=CarmackCompress((unsigned char huge *)block,size,(unsigned char huge *)block2+2)+2;
maplengths[i]+=nsize;
if (nsize==2)
{
RestoreBackground();
MMFreePtr(&block2);
MMFreePtr(&block);
MMFreePtr(&block1);
LoadMap(whichmap);
xbase=oxb;
ybase=oyb;
ErrDialog("ESC out of this infernal thing!"," YES! ");
return;
}
SaveFile(huffname,block2,fsize,nsize);
TempHeader.mapbkgndpl=fsize;
TempHeader.mapbkgndlen=nsize;
MMFreePtr(&block2);
MMFreePtr(&block);
fsize+=nsize;
}
if (MapFileHeader->maptype&FPLANE)
{
size=TempHeader.mapfrgndlen;
MMAllocate(&block,size);
MMAllocate(&block2,size);
LoadFile(mapname,block,TempHeader.mapfrgndpl,size);
*(int _seg *)block2=TempHeader.mapfrgndlen;
nsize=CarmackCompress((unsigned char huge *)block,size,(unsigned char huge *)block2+2)+2;
maplengths[i]+=nsize;
if (nsize==2)
{
RestoreBackground();
MMFreePtr(&block2);
MMFreePtr(&block);
MMFreePtr(&block1);
LoadMap(whichmap);
xbase=oxb;
ybase=oyb;
ErrDialog("ESC out of this infernal thing!"," YES! ");
return;
}
SaveFile(huffname,block2,fsize,nsize);
TempHeader.mapfrgndpl=fsize;
TempHeader.mapfrgndlen=nsize;
MMFreePtr(&block2);
MMFreePtr(&block);
fsize+=nsize;
}
if (MapFileHeader->maptype&IPLANE)
{
size=TempHeader.mapinfolen;
MMAllocate(&block,size);
MMAllocate(&block2,size);
LoadFile(mapname,block,TempHeader.mapinfopl,size);
*(int _seg *)block2=TempHeader.mapinfolen;
nsize=CarmackCompress((unsigned char huge *)block,size,(unsigned char huge *)block2+2)+2;
maplengths[i]+=nsize;
if (nsize==2)
{
RestoreBackground();
MMFreePtr(&block2);
MMFreePtr(&block);
MMFreePtr(&block1);
LoadMap(whichmap);
xbase=oxb;
ybase=oyb;
ErrDialog("ESC out of this infernal thing!"," YES! ");
return;
}
SaveFile(huffname,block2,fsize,nsize);
TempHeader.mapinfopl=fsize;
TempHeader.mapinfolen=nsize;
MMFreePtr(&block2);
MMFreePtr(&block);
fsize+=nsize;
}
#pragma warn +sus
//
// SAVE MAP HEADER
//
nsize=sizeof(TempHeader);
maplengths[i]+=nsize;
SaveFile(huffname,(char huge *)&TempHeader,fsize,nsize);
NewFileHeader.dataoffsets[i]=fsize;
fsize+=nsize;
SaveFile(huffname,"!ID!",fsize,4);
fsize+=4;
}
MMFreePtr(&block1);
//
// COPY PERTINENT MAPFILEHEADER DATA TO NEWFILEHEADER
//
{
char outname[14],tempname[14]="MTEMP.TMP",doutname[14];
strcpy(outname,ext);
strcat(outname,"MHEAD.OBJ");
NewFileHeader.RLEWtag=MapFileHeader->RLEWtag;
fsize=sizeof(OutputHeadStr);
SaveFile(tempname,(char huge *)&NewFileHeader,0,fsize);
for (i=0;i<numtplanes;i++)
{
SaveFile(tempname,MK_FP(Tinfo[i],0),fsize,tilenum);
fsize+=tilenum;
}
for (i=0;i<numtmplanes;i++)
{
SaveFile(tempname,MK_FP(TMinfo[i],0),fsize,tilemnum);
fsize+=tilemnum;
}
MakeOBJ(tempname,outname,"_maphead",FARDATA,"MapHeader");
// unlink(tempname);
}
RestoreBackground();
SignalSound();
//
// FINSIHED. PRINT REPORT?
//
if (Message("Finished with compression.\n"
"Print report on lengths?")==2)
{
fprintf(stdprn,"TED5 Carmacized Map Lengths for .%s\n\n",ext);
fprintf(stdprn,"#\tMap Name\t\tLength\n");
fprintf(stdprn,"_\t--------\t\t------\n");
for (i=0;i<100;i++)
if (MapFileHeader->dataoffsets[i]!=-1)
{
char tstr[16];
strcpy(tstr,MapNames[i]);
while(strlen(tstr)<16)
strcat(tstr," ");
fprintf(stdprn,"%d\t%s\t%d\n",i,tstr,maplengths[i]);
}
fprintf(stdprn,"%c",12);
}
LoadMap(whichmap);
xbase=oxb;
ybase=oyb;
}
////////////////////////////////////////////////////
//
// Item - Change the LAUNCH name
//
////////////////////////////////////////////////////
btype CLNb={" ",1,5,1};
DialogDef CLNd={"Current LAUNCH name:\n\n\nNew LAUNCH name:",38,7,1,&CLNb,NULL};
void Item_LAUNCHname(void)
{
char tempstr[40];
MouseHide();
DrawDialog(&CLNd,1);
GetDialogXY(&CLNd,&sx,&sy);
sy++;
sx++;
print(launchname);
GetButtonXY(&CLNd,0,&sx,&sy);
if (input(tempstr,36))
{
strcpy(launchname,tempstr);
SaveTEDInfo();
}
MouseShow();
RestoreBackground();
}
////////////////////////////////////////////////////
//
// Item - Change the PARM string
//
////////////////////////////////////////////////////
btype CPSb={" ",1,5,1};
DialogDef CPSd={"Current PARM string:\n\n\nNew PARM string:",38,7,1,&CPSb,NULL};
void Item_PARMstring(void)
{
char tempstr[40];
MouseHide();
DrawDialog(&CPSd,1);
GetDialogXY(&CPSd,&sx,&sy);
sy++;
sx++;
print(parmstring);
GetButtonXY(&CPSd,0,&sx,&sy);
if (input(tempstr,36))
{
strcpy(parmstring,tempstr);
_fstrcpy(TEDInfo->parmstring,(char far *)parmstring);
SaveTEDInfo();
}
MouseShow();
RestoreBackground();
}
////////////////////////////////////////////////////
//
// Item - Change Icon Rows
//
////////////////////////////////////////////////////
btype CIRb={" ",8,4,1};
DialogDef CIRd={"Enter amount of icons\n"
"to add/delete.\n"
"Use + or -.",22,6,1,&CIRb,NULL};
void Item_ChangeIconRows(void)
{
unsigned i,j,dx,dy,max,oxbase,oybase,base;
int value,owm;
memptr block;
if (!(MapFileHeader->maptype&IPLANE))
{
ErrDialog("You don't have an icon plane!"," OK ");
return;
}
CheckForMapSave();
oxbase=xbase;
oybase=ybase;
DrawDialog(&CIRd,1);
GetButtonXY(&CIRd,0,&dx,&dy);
sx=dx;
sy=dy;
MouseHide();
value=inputint(3);
MouseShow();
if (!value || value==(int)ESCOUT)
{
RestoreBackground();
return;
}
value=SGN(value)*(18*((abs(value)+17)/18));
base=18*maxiconrows;
maxiconrows+=value/18;
MapFileHeader->NumIconRows+=value/18;
owm=whichmap;
RestoreBackground();
//
// MAKE SURE WE ADJUST TILEINFOM!
//
MMAllocate(&block,tilemnum+value);
for (i=0;i<numtmplanes;i++)
{
_fmemset(block,0,tilemnum+value);
movedata((unsigned)TMinfo[i],0,(unsigned)block,0,base);
movedata((unsigned)TMinfo[i],base,
(unsigned)block,base+value,tilemnum-base);
MMFreePtr((memptr *)&TMinfo[i]);
MMAllocate((memptr *)&TMinfo[i],tilemnum+value);
movedata((unsigned)block,0,(unsigned)TMinfo[i],0,tilemnum+value);
}
MMFreePtr(&block);
MapFileHeader->oldtilemnum=tilemnum+value;
//
// RUN THROUGH EACH MAP AND ADJUST TILEM VALUES
//
for (i=0;i<100;i++)
if (MapFileHeader->dataoffsets[i]>=0)
{
whichmap=i;
LoadMap(i);
max=mapwidth*mapheight;
for (j=0;j<max;j++)
if (MapFrgnd[j]>0)
MapFrgnd[j]+=value;
DirtyFlag=1;
SaveMap(0);
}
DirtyFlag=0;
whichmap=owm;
LoadMap(whichmap);
xbase=oxbase;
ybase=oybase;
DrawMap();
ErrDialog("If your map looks messed up,\n"
"you need to change the amount\n"
"of icons in your IGRAB script\n"
"and re-grab your tiles!"," OK ");
}
////////////////////////////////////////////////////
//
// Item - Change LAUNCH Icon
//
////////////////////////////////////////////////////
void Item_ChangeLaunchIcon(void)
{
sound(1700);
TEDInfo->permicon=whichi-tilenum;
delay(30);
nosound();
}
////////////////////////////////////////////////////
//
// Item - Change Background color
//
////////////////////////////////////////////////////
btype CBCb[]={{"\xb",5,2,1},
{"\xc",16,2,1},
{"Exit",9,2,2}};
DialogDef CBCd={"Change Backgrnd Color!",22,4,3,&CBCb[0],0};
void Item_ChangeBkgndColor(void)
{
int which;
do
{
which=DoDialog(&CBCd);
switch(which)
{
case 1:
sound(1700);
if (--BkgndColor<0)
BkgndColor=15;
TEDInfo->BackgndColor=BkgndColor;
DrawMap();
DrawInfoBar();
break;
case 2:
sound(1700);
if (++BkgndColor>15)
BkgndColor=0;
TEDInfo->BackgndColor=BkgndColor;
DrawMap();
DrawInfoBar();
}
nosound();
} while(which>0 && which<3);
}